package com.leyou.trade.service.impl;

import com.leyou.auth.utils.UserContext;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartItemRepository;
import com.leyou.trade.service.CartItemService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

@Service
public class CartItemServiceImpl implements CartItemService {

    @Autowired
    private CartItemRepository repository;
    /**
     * 添加购物车
     * @param cartItem  参数信息
     */
    @Override
    public void saveCartItem(CartItem cartItem) {

        //获取用户id
        Long userId = UserContext.getUser().getId();
        //获取购物车数据的id
        String id = CartItem.generateId(userId, cartItem.getSkuId());
        //尝试从mongoDB获取当前商品
        Optional<CartItem> optional = repository.findById(id);
        //判断是否存在
        if (optional.isPresent()){
            //在覆盖之前取出旧数据
            Integer oldNum = cartItem.getNum();
            //存在 获取已经存在的商品
            cartItem= optional.get();
            //数量累加
            cartItem.setNum(cartItem.getNum()+cartItem.getNum());
        }
        //填充id
        cartItem.setId(id);
        //填充userId
        cartItem.setUserId(userId);
        //填充添加事件
        cartItem.setUpdateTime(new Date());
        //写回mongoDb
        repository.save(cartItem);
    }

    /**
     * 查询购物车信息
     */
    @Override
    public List<CartItem> queryCartList() {

        //获取当前用户信息
        Long userId = UserContext.getUser().getId();
        //从mongoDb中查找当前用户的购物车信息，根据添加事件进行排序
        return repository.findByUserIdOrderByUpdateTimeDesc(userId);

    }

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void updateCartNum(Long skuId, Integer num) {
        //获取用户id
        Long userId = UserContext.getUser().getId();

        //根据id匹配 更新num字段
        //db.getCollection(`cart_user_32`).update({"_id",id},{$set:{num:num}})
        mongoTemplate.update(CartItem.class)
                .matching(Query.query(Criteria.where("_id").is(CartItem.generateId(userId,skuId))))
                .apply(Update.update("num",num))
                .first();

    }

    /**
     * 删除指定的购物车商品
     * @param skuId 商品id
     */
    @Override
    public void deleteCart(Long skuId) {
        //获取当前用户
        Long userId = UserContext.getUser().getId();
        repository.deleteById(CartItem.generateId(userId,skuId));
    }

    /**
     * 批量添加购物车
     * @param itemList 未登录时购物车信息
     */
    @Override
    public void addCartItemList(List<CartItem> itemList) {
        //获取用户id
        Long userId = UserContext.getUser().getId();
        //创建一个list集合  批量新增购物车数据
        List<CartItem> list = new ArrayList<>(itemList.size());
        for (CartItem cartItem : itemList) {
            //获取数据库id
            String id = CartItem.generateId(userId, cartItem.getSkuId());
            //查询购物车商品
            Optional<CartItem> optional = repository.findById(id);
            //判断是否存在
            if (optional.isPresent()){
                //如果存在  获取mongoDb中的oldNum
                Integer oldNum = cartItem.getNum();
                cartItem = optional.get();
                //累加商品数量
                cartItem.setNum(oldNum+cartItem.getNum());
            }
            //填充id
            cartItem.setId(id);
            //填充userId
            cartItem.setUserId(userId);
            //填充时间
            cartItem.setUpdateTime(new Date());
            //存放到集合
            list.add(cartItem);
        }

        //写入mongoDb
        repository.saveAll(list);
    }


}
